from django.shortcuts import render
from django.views.generic.base import View
import string,random
from captcha.image import ImageCaptcha
from django_redis import get_redis_connection
from django.http import HttpResponse,JsonResponse
import logging
from mgproject.utils.huyi_sms.sms3 import send_sms_code

# Create your views here.
logger=logging.getLogger('django')
class ImgcodeView(View):
    def get(self,request,uuid):
        """
        获取图片验证码资源
        """
        #随机生成验证码4位数字
        seeds=string.digits #'0123456789'
        r=random.choices(seeds,k=4) #['8''7''9''6']
        imgcode_str =''.join(r)#'8796'
        #根据生成的数字创建图片验证啊资源
        img=ImageCaptcha().generate(chars=imgcode_str)
        #将数据验证码存入到数据库中
        redis_connection=get_redis_connection('verify_code')
        redis_connection.setex('img_%s'%uuid,300,imgcode_str)
        #返回资源给前端
        return HttpResponse(img,content_type='image/png')
class Smscode(View):
    def get(self,request,phone):
        '''
        匹配并删除图形验证码图形验证码
        发送短信验证码功能
        '''
        # 1.获取请求参数 （路径参数，查询字符串）
        imgcode_client=request.GET.get('imgcode','')
        uuid=request.GET.get('uuid','')

        # 2.校验参数(完整性)
        if not all([phone,imgcode_client,uuid]):
            return JsonResponse({'code':'4001','errormsg':'缺少必要参数'})
        #建立redis数据库连接
        redis_conn = get_redis_connection('verify_code')
        is_send=redis_conn.get('si_send_%s'%phone)
        #判断短信验证码发送是否国与频繁
        if is_send :
            return JsonResponse({'code':'4004','errermsg':'发送短信验证码过于频繁'})

        # 3.获取服务器端生成的图片验证码

        imgcode_server=redis_conn.get('img_%s'%uuid)
        # 4.匹配（非空判断/一致性判断）
        if imgcode_server is None:
            return  JsonResponse({'code':'4002','errormsg':'图片验证码过期'})
        if imgcode_client.lower() != imgcode_server.decode('utf-8').lower():
            return JsonResponse({'code':'4003','errormsg':'图片验证码不一致'})
        # 5.删除图片验证码（）避免客户恶意测试
        try:
            redis_conn.delete('img_%s'%uuid)
        except Exception as e:
            logger.error(e)
        # 6.生成短信验证码(6位数字)
        seed=string.digits
        r=random.choices(seed,k=6)
        smscode_str=''.join(r)
        #7.保存短信验证码到redis数据库中
        redis_conn.setex('img_%s'%phone,600,smscode_str)
        redis_conn.setex('is_send%s'%phone,600,1)
        #利用管道的方法实现上述功能
        # pl=redis_conn.pipeline()
        # pl.setex('img_%s'%phone,60,smscode_str)
        # pl.setex('is_send%s'%phone,60,1)
        # pl.execute()
        # 异步执行短信验证码功能
        from mgproject.celery_tasks.sms.tasks import huyi_send_sms_code
        #Celery异步发送短信验证码
        ret = huyi_send_sms_code.delay(phone, smscode_str)
        # 8. 根据外部接⼝返回值响应前端结果
        ret = send_sms_code(smscode_str, phone)

        if ret:  # 执⾏⼀个任务就返回⼀个taskid 689e889c-a607-49f3-9777-248a8dcce310
            return JsonResponse({'code': '200', 'errormsg': 'OK'})
        return JsonResponse({'code': '5001', 'errormsg': '发送短信验证码错误'})
       # 8.发送短信验证码
       #  ret=send_sms_code(smscode_str,phone)
       #
       #  # 8.根据外部接口返回值响应前端结果
       #  if ret.get('code') == 2:
       #      return JsonResponse({'code':'200','error_message':'OK'})
       #  return JsonResponse({'code':'5001','errormsg':'发送短信验证码错误'})
class CheckSMScode(View):
    def get(self,request,phone):
        '''
        用户校验时短信验证码的校验功能
        '''
        #1 接受请求参数
        smscode_client=request.GET.get('smscode','')
        #2 校验参数
        if not all([phone,smscode_client]):
            return JsonResponse({'code':'4001','errormsg':'缺少必传参数'})
        #查询服务器端短信验证码
        redis_coon=get_redis_connection('verify_code')
        smscode_server=redis_coon.get('sms_%s'%phone)
        #3匹配参数(非空判断/有效性判断)
        if smscode_server is None:
            return JsonResponse({'code':'4002','errormsg':'短信验证码过期'})
        sms=smscode_server.decode('utf-8')
        if smscode_client!=sms:
            return JsonResponse({'code':'4003','errormsg':'短信验证码不一致'})
        #4响应结果
        return JsonResponse({'code':'200','errormsg':'ok'})
